package com.example.spring.job;

import com.example.autojob.skeleton.framework.task.AutoJobRunningContext;
import com.example.autojob.skeleton.framework.task.AutoJobTask;
import com.example.autojob.skeleton.framework.task.AutoJobTemplate;
import com.example.autojob.util.io.PropertiesHolder;
import com.example.autojob.util.thread.SyncHelper;

import java.io.InputStream;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @author JingGe(* ^ ▽ ^ *)
 * @date 2023-03-28 16:46
 * @email 1158055613@qq.com
 */
//@TemplateAutoJob
public class TemplateJob extends AutoJobTemplate {
    @Override
    public Object run(Object[] params, AutoJobRunningContext context) throws InterruptedException {
        context
                .getLogHelper()
                .info("你好呀");
        SyncHelper.sleep(5, TimeUnit.SECONDS);
        return "hello template job" + params[0];
    }

    /**
     * 有时该任务的一些行为需要通过配置文件给出，此时子类可以覆盖该方法返回类路径下的配置文件路径，模板将会创建一个{@link PropertiesHolder}对象
     *
     * @return java.lang.String
     * @author JingGe(* ^ ▽ ^ *)
     * @date 2023/3/29 10:56
     */
    @Override
    public String withProfile() {
        return "template-job-config.properties";
    }

    /**
     * 有时配置不来自于配置文件，此时可以通过输入流导入
     *
     * @return java.util.List<java.io.InputStream>
     * @author JingGe(* ^ ▽ ^ *)
     * @date 2023/3/29 17:55
     */
    @Override
    public List<InputStream> withProfilesInputStream() {
        return super.withProfilesInputStream();
    }

    /**
     * 子类可以控制任务执行与否，这里通过从配置文件读取
     *
     * @return boolean
     * @author JingGe(* ^ ▽ ^ *)
     * @date 2023/3/29 10:57
     */
    @Override
    public boolean enable() {
        return propertiesHolder.getProperty("enable.job", Boolean.class, "true");
    }

    @Override
    public Object[] params() {
        return new Object[]{"你好"};
    }

    @Override
    public String cron() {
        return "30 27 10 * * ?";
    }

    @Override
    public Long annotationID() {
        return 1L;
    }

    @Override
    public AutoJobTask.TaskType taskType() {
        return AutoJobTask.TaskType.DB_TASK;
    }
}
